package DAO;

import Pojo.Cliente;
import Pojo.Item;
import Pojo.NotaFiscal;
import Pojo.Pedido;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**Classe que contem a Lista de notas fiscais e seus métodos
 * 
 * @author Vitor
 */
public class NotaFiscalDAO {
    ArrayList<NotaFiscal> notasFiscais = new ArrayList<NotaFiscal>();

    /**Método que retorna a lista de notas fiscais
     * 
     * @return ArrayList - Retorna um ArrayList do tipo NotaFiscal
     */
    public ArrayList<NotaFiscal> getNotasFiscais() {
        return notasFiscais;
    }
    
    
    /**Método utilizado para adicionar uma nova nota fiscal a lista
     * 
     * @param notaFiscal NotaFiscal - Contém as informacoes da nota fiscal
     */
    public void adicionarNotaFiscal(NotaFiscal notaFiscal) {
        this.notasFiscais.add(notaFiscal);
    }

    
    /**Método utilizado para ler do arquivo
     * 
     * @param itemDao ItemDAO - Contem todos metodos para auxiliar a busca de um Item
     * @param clienteDao - Contem todos metodos para auxiliar a busca de um Cliente
     * @param pedidoDao - Contem todos metodos para auxiliar a busca de um Pedido
     * @throws FileNotFoundException - Sem descricao
     * @throws ParseException - Sem descricao
     */
    public void lerArquivo(ItemDAO itemDao, ClienteDAO clienteDao, PedidoDAO pedidoDao ) throws FileNotFoundException, ParseException{

        Item item = null;
      //Le de um arquivo .txt os atributos da nota Fiscal
        
        Scanner scanner = new Scanner(new FileReader("NotasFiscais.txt"))
                       .useDelimiter("\\||\\n");
        
        while (scanner.hasNext()) {
           
            NotaFiscal novaNota = new NotaFiscal();
            Pedido novoPedido = new Pedido();
            
            DateFormat formatter = new SimpleDateFormat("MM/dd/yy");  
            novaNota.setData(formatter.parse( scanner.nextLine() ));
            
            String s[] = scanner.nextLine().split(" ");
            for (int i = 0; i < s.length; i++) {
                if(i%2==0){
                    String s1 = s[i];
                    item = itemDao.buscaItemNome(s1);
                }else{
                    int quantidade = Integer.parseInt(s[i]);
                    novoPedido.setItem(item, quantidade);    
                } 
            }
                        
            novoPedido.setCodigo(Integer.parseInt(scanner.nextLine()));
            novoPedido.setPreco(Float.parseFloat(scanner.nextLine()));
            Cliente aux = clienteDao.buscaCpf( scanner.nextLine() );
            novoPedido.setCliente(aux);
            
            novaNota.setPedido(novoPedido);
            adicionarNotaFiscal(novaNota);
        }
    }
    
    
    /**Método que grava no arquivo
     * 
     */
    public void escreverArquivo(){

        try {
            FileWriter fw = new FileWriter("NotasFiscais.txt",false);
            PrintWriter saida = new PrintWriter(fw,true);
            
            
            for(NotaFiscal notaFiscal : this.notasFiscais ){
                
                DateFormat formatter = new SimpleDateFormat("MM/dd/yy");  
                saida.println(formatter.format(notaFiscal.getData()));
                
                HashMap<Item,Integer> hashItens = notaFiscal.getPedido().getHash();
                for ( Map.Entry<Item, Integer> entry: hashItens.entrySet()) {
                      Item itemAux = entry.getKey();
                      saida.print(itemAux.getNome()+" ");
                      saida.print(entry.getValue()+" ");
                }
                saida.println();
                saida.println(notaFiscal.getPedido().getCodigo());
                saida.println(notaFiscal.getPedido().getPreco());
                saida.println(notaFiscal.getPedido().getCliente().getCpf());
            }          
            saida.close();
            fw.close();
        } catch (IOException e) {
        }
    }
}
